package com.example.javapracticaltraining.utils;

import com.alibaba.fastjson2.JSONObject;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class ChatUtil {

	@Value("${ai.api.url}")
	private String apiUrl;

	@Value("${ai.api.key}")
	private String apiKey;

	@Value("${ai.model.name}")
	private String modelName;

	@Value("${ai.max.message:10}") // 默认值10
	private int maxMessage;

	private final Map<Integer, ChatMemory> memories = new ConcurrentHashMap<>();

	public String chat(String message, Integer userId) {
		if (userId == null) {
			throw new IllegalArgumentException("用户ID不能为空");
		}

		try {
			Assistant assistant = createAssistant(userId);
			return assistant.chat(message);
		} catch (Exception e) {
			throw new RuntimeException("AI服务调用失败", e);
		}
	}

	private Assistant createAssistant(Integer userId) {
		ChatLanguageModel model = createModel();
		ChatMemory memory = getOrCreateMemory(userId);
		return AiServices.builder(Assistant.class)
				.systemMessageProvider(message -> """
						你是一位老年健康顾问AI，响应必须严格遵循以下规则：
						      
						【格式规则】
						1. 绝对禁止使用任何Markdown符号：包括**、###、__、*等
						3. 列表项只能使用数字(1.)或全角圆点(•)
						4. 重点内容用全角感叹号标注！！不要使用任何加粗符号
						5. 段落之间用空行分隔，不要用分割线
						      
						【内容规则】
						1. 对医护人员使用专业术语，对老人使用简单词汇
						2. 紧急情况必须用全大写和！！标注，例如：！！立即就医！！
						3. 不确定的内容必须声明'请咨询医生'
						""")
				.chatLanguageModel(model)
				.chatMemory(memory)
				.build();
	}

	private ChatMemory getOrCreateMemory(Integer userId) {
		return memories.computeIfAbsent(userId, id ->
				MessageWindowChatMemory.builder()
						.id(String.valueOf(id)) // 确保ID是字符串类型
						.maxMessages(maxMessage)
						.build()
		);
	}

	private ChatLanguageModel createModel() {
		return OpenAiChatModel.builder()
				.baseUrl(apiUrl)
				.apiKey(apiKey)
				.modelName(modelName)
				.build();
	}


	interface Assistant {
		String chat(String message);
	}

}